该文章以收录 《nodeJS探索之路》

本文所有练习已放入:https://github.com/webxiaoma/nodeJS-demos 的 file 文件夹中


前言

fs模块在nodeJS算是比较重要的模块了,本文主要讲的是nodejs 中fs模块的基础知识,目的是了解fs模块的大体作用。使用前先要引入fs模块,本文约定以const fs=require('fs')引入。详细的API请访问官网fs模块

同步和异步

fs模块中的方法一般的都有同步和异步的方法,例如读取文件

异步方法:

fs.readFile('./test.txt',(err,data)=>{
    if(err) throw err;
    console.log(data)
})

同步方法

let SyncFile = fs.readFileSync( './test.txt','utf-8');
cosnole.log(SyncFile);

一般同步方法是在异步方法名后面加上了Sync 一词。

文件处理

1.读取文件内容

fs.readFile(path[, options], callback)

参数:

  • path <string> | <Buffer> | <URL> | <integer> 文件名或文件描述符。

  • options <Object> | <string>

  1. encoding <string> | <null> 默认为 null。

  2. flag <string> 默认为 'r'。

  • callback <Function>

  1. err <Error>

  2. data <string> | <Buffer>

fs.readFile('./test.txt',function(err,data){
    if(err){
        throw err;
    }
    console.log(data) 
    console.log(data.toString())
})

2.写入文件内容

fs.writeFile(file, data[, options], callback)异步地写入数据到文件,如果文件已经存在,则替代文件。

  • file <string> | <Buffer> | <integer> 文件名或文件描述符

  • data <string> | <Buffer> | <Uint8Array>

  • options <Object> | <string>

  1. encoding <string> | <null> 默认 = 'utf8'

  2. mode <integer> 默认 = 0o666

  3. flag <string> 默认 = 'w'

  • callback <Function>

fs.writeFile('./write.txt','test',err =>{
    if(err) throw err;
    console.log("写入成功");

    fs.readFile('./write.txt','utf-8',(err,data) =>{
        if(err) throw err;

        console.log('读取成功:'+ data);
    })
})

3.删除文件内容

fs.unlink(path, callback)

  • path <string> | <Buffer> | <URL>

  • callback <Function>

  1. err <Error>

fs.unlink('./delete.txt',err=>{
   assert.ifError(err);
   console.log('以删除文件:delete.txt')
})

4.追加文件内容

fs.appendFile(file, data[, options], callback)如果追加内容的文件不存在则,创建该文件

  • file <string> | <Buffer> | <number> 文件名或文件描述符

  • data <string> | <Buffer>

  • options <Object> | <string>

  1. encoding <string> | <null> 默认为 'utf8'

  2. mode <integer> 默认为 0o666

  3. flag <string> 默认为 'a'

  • callback <Function>

  1. err <Error>

fs.appendFile('./add.txt','追加的内容','utf8',(err)=>{
   assert.ifError(err);
   console.log(fs.readFileSync('./add.txt','utf8')) 
})

5.截取文件内容

在说截取文件内容之前,我们还要说一种打开文件,读取写入文件内容的方法

打开文件: fs.open
读取文件内容: fs.read
写入文件内容:fs.write
关闭文件:fs.close

他们和readFilewriteFile的区别就是比较底层,fs.readfs.write需要依托fs.open, 打开文件得到文件句柄,然后基于文件句柄读写。实际上我们用的readFilewriteFile还是比较多。我们来看一个例子:

fs.open('./open.txt','a+',(err,fd)=>{
    if(err) throw err;
    console.log("文件以打开");

    let readBuffer = new Buffer.alloc(30);
    let writeBuffer = new Buffer.from(" add content")
    fs.write(fd,writeBuffer,0,writeBuffer.length,0,(err,bytesWritten,buffer)=>{
        if(err) throw err;

        console.log(`写入成功,写入的长度:${bytesWritten}, 写入的内容:${buffer}`);
        //写入成功,写入的长度: 12, 写入的内容:add content

          fs.read(fd,readBuffer,0,30,0,(err, bytesRead, buffer)=>{
            if(err) throw err;
            console.log(bytesRead) // 17
            console.log(buffer.toString());// last add content

            // 关闭
            fs.close(fd);

         })
         

    })

   
})

我们这里说的截取文件内容的方法是基于fs.open方法的

fs.ftruncate(fd[, len], callback)

  • fd <integer>

  • len <integer> 默认 = 0

  • callback <Function>

  1. err <Error>

let fd = fs.openSync('open.txt','r+');

fs.ftruncate(fd,5,(err)=>{
    assert.ifError(err);
    console.log("截取内容为:" +fs.readFileSync('open.txt','utf-8'));
    //截取内容为:last
     fs.close(fd);
});

目录操作

1.创建目录

如果文件已经存在,会报错

fs.mkdir('./newdir',function(err){
    
    if(err) throw err
    console.log("make dir success")
})

2.读取目录

fs.readdir('./newdir',(err,files)=>{
     if(err) throw err;
     // files 是一个数组
     console.log(Array.isArray(files))
     console.log("读目录取成功:"+ files);
})

3.删除目录

删除目录时,如果目录不是空的将会报错

fs.rmdir('./delete_dir',function(err){
   if(err) throw err;
   console.log('delete dir success')

})

读取文件的常用模式

mode 用于创建文件时给文件制定权限,默认0666

flag:

'r' -   以读取模式打开文件。
'r+' - 以读写模式打开文件。
'rs' - 使用同步模式打开并读取文件。指示操作系统忽略本地文件系统缓存。
'rs+' - 以同步的方式打开,读取 并 写入文件。
//注意:这不是让fs.open变成同步模式的阻塞操作。如果想要同步模式请使用fs.openSync()。
 
'w' - 以读取模式打开文件,如果文件不存在则创建
'wx' - 和 ' w ' 模式一样,如果文件存在则返回失败
'w+' - 以读写模式打开文件,如果文件不存在则创建
'wx+' - 和 ' w+ ' 模式一样,如果文件存在则返回失败
 
'a' - 以追加模式打开文件,如果文件不存在则创建
'ax' - 和 ' a ' 模式一样,如果文件存在则返回失败
'a+' - 以读取追加模式打开文件,如果文件不存在则创建
'ax+' - 和 ' a+ ' 模式一样,如果文件存在则返回失败

结束

详细API 请访问node官网


webxiaoma
747 声望27 粉丝

代码搬运工


« 上一篇
js函数探索
下一篇 »
React核心知识